# -*- coding: UTF-8 -*- #
"""
-------真正的勇士， 敢于直面惨淡的Warning、 敢于正视淋漓的Error-----
@author : 贾鹏博
@file : 6、app控件定位 - 包含uiautomator.py
@time : 2022/5/20 16:35
"""

"""
android/ios 基础知识
dom 结构解读
id、aid、xpath定位方法
uiautomatorviewer 定位工具使用


Android 四大组件：
    activity 与用户交互的可视化界面
    server   实现程序后台运行的解决方案
    content provider 内容提供者，提供程序所需要的数据
    broadcast receiver 广播接收器，监听外部事件的到来（比如电话）
    
常见的控件 ：
    TextView（文本控件） EditTest(可编程文本控件)
    Button(按钮)，ImageButton（图片按钮）, ToggleButton(开关按钮)
    ImageView(图片控件)
    CheckBox(复选框控件) , RadioButton(单选框控件)
    
元素定位： 
    实际上就是定位控件
    要想保证一个脚本支持 android/ios 两个系统，就得保证元素属性（id、aid、xpath）一致
    
控件的基础知识：
    dom ： Document Object Model 文本对象模型
    dom 应用 ： 最早应用于 html 和 js 的交互，用于表示界面的控件层级，界面的结构描述。常见的格式为 html、xml。核心元素为节点和属性
    xpath : xml 路径语言，用于 xml 中的节点定位
    
    Android 应用的层级结构与 html 不一样，是一个定制的 xml
    app source 类似于 dom,表示 app 的层级，代表了界面里面所有的控件树的结构
    每个控件都有它的属性（resourceid.xpath.aid）,没有 css 属性

app dom 为例
    node
    attrubute : clickable 、 content-desc 、 resource-id 、 text 、 bounds

iOS 和  Android 的区别
    dom 属性和节点结构类似
    名字和属性的命名不同
        比如：android resource、ios name
        android content-des,ios accessibility-id
    
测试步骤的三要素 ：
    定位，交互，断言
定位方式 :
    id定位：
            driver.find_element_by_id(resouce-id属性)
            driver.find_element(MobileBy.ID,"resource:id")
    accessibility_id 定位 ： 
            driver.find_element_by_accessibility_id(content-desc属性值)
            driver.find_element(MobileBy.ACCESSIBILITY_ID,"content_desc:属性")
    xpath 定位 ：
            driver.find_element_by_xpath（xpath属性）
    name 定位：
            元素的名称
    
    Class_Name定位
    ID 定位
            
     
定位工具 ：
uiautomatorviewer 工具（only android）
    推荐使用
    sdk路径下的工具
Appium inspector 工具    
 
uiautomator 定位 方法：
    单属性定位：属性名("<属性值>")  注意：外面是单引号，里面是双引号
         （AppiumBy.ANDROID_UIAUTOMATOR,'new UiSelector().resourceId("android:id/text1")')
    
    模糊匹配：
        文本包含 textContains:
            new.UiSelector().textContains("Access")
        文字以 xx 开头  textStartsWith:
            new.UiSelector().textStartsWith("Ani")
        文字正则匹配    textMatches:
            new.UiSelector().textMatches("^Pre.*")
        层级定位：
            兄弟元素定位：fromParent
            父子节点定位：childSelect
         
"""

import pytest
from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy


# Api Demos app
class Testdw:
    def setup(self):
        desired_caps = {}
        desired_caps['platformName'] = "Android"
        desired_caps['platformVersion'] = '6.0'
        desired_caps['deviceName'] = 'emulator-5554'
        desired_caps['appPackage'] = 'io.appium.android.apis'
        desired_caps['appActivity'] = '.ApiDemos'
        self.driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
        self.driver.implicitly_wait(5)

    def teardown(self):
        self.driver.quit()

    def test_id(self):
        """
        通过 id 定位
        @return:
        """
        element = self.driver.find_element(AppiumBy.ID, "android:id/text1")
        element.click()

    def test_contentdesc(self):
        """
        Android: Comtent-desc
        @return:
        """
        element = self.driver.find_element(AppiumBy.ACCESSIBILITY_ID, "Content")
        element.click()

    def test_xpath(self):
        """
        xpath
        @return:
        """
        element = self.driver.find_element(AppiumBy.XPATH, "//*[@text='Content']")
        element.click()

    def test_xpath_more(self):
        """
        xpath 多条件
        @return:
        """
        element = self.driver.find_element(AppiumBy.XPATH, "//*[@resource-id='android:id/text1' and @text='Content']")
        element.click()

    # 原生定位
    def test_uiautomator(self):
        """
        anroid uiautomator 定位
        @return:
        """
        element = self.driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR,
                                           'new UiSelector().resourceId("android:id/text1")')
        element.click()

    # 原生定位
    def test_mul_uiautomator(self):
        """
        anroid uiautomator 多条件定位
        @return:
        """
        element = self.driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR,
                                           'new UiSelector().resourceId("android:id/text1").text("Content")')
        element.click()

    # 原生正则匹配
    def test_uiautomator_re(self):
        """
        anroid uiautomator 正则表达式
        @return:
        """
        element = self.driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR,
                                           'new.UiSelector().textMatches("^Pre*")')
        element.click()


# 雪球 app
class TestDW():

    def setup(self):
        desired_caps = {}
        desired_caps['platformName'] = "Android"
        desired_caps['platformVersion'] = '6.0'
        desired_caps['deviceName'] = 'emulator-5554'
        desired_caps['appPackage'] = 'com.xueqiu.android'
        desired_caps['appActivity'] = '.common.MainActivity'
        desired_caps['noReset'] = 'true'
        # desired_caps['dontStopAppOnReset'] = 'true'
        desired_caps['skipDeviceInitialization'] = 'true'
        desired_caps['unicodeKeyBoard'] = 'true'
        desired_caps['resetKeyBoard'] = 'true'
        self.driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
        self.driver.implicitly_wait(5)

    def teardown(self):
        self.driver.quit()

    def test_search(self):
        """
        1、打开雪球 app
        2、点击搜索输入框
        3、向搜索输入框里面输入 '阿里巴巴'
        4、在搜索结果里面选择 '阿里巴巴'，然后进行点击
        5、获取这只 香港 阿里巴巴的股价，并 判断 这只股价的价格 > 200
        :return:
        """
        print('搜索测试用例')
        self.driver.find_element(AppiumBy.ID, 'com.xueqiu.android:id/tv_search').click()
        self.driver.find_element(AppiumBy.ID, 'com.xueqiu.android:id/search_input_text').send_keys('阿里巴巴')
        self.driver.find_element(AppiumBy.XPATH,
                                 "//*[@resource-id='com.xueqiu.android:id/name' and @text='阿里巴巴']").click()
        current_price = float(self.driver.find_element(AppiumBy.ID, 'com.xueqiu.android:id/current_price').text)
        assert current_price == 63.74
